package com.litong.litongjiaoyu.utils;

import com.alibaba.fastjson.JSON;
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Component;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

/**
 * @author jingz
 * @Description 文件操作类
 * @Date 2020-02-07
 */

@Component
@Log4j2
public class FileUtils {

    /**
    * @description: 创建并添加内容
    * @author jingz
    * @data 2020/2/7 13:58
    * @param fileTitle 文件名（包括后缀）例如 123.png
    * @param context    内容
    * @param filePath 文件路径,例如 /home/data/img/
    * @return java.lang.String (返回文件路径)
    **/
    public static String writeFile(String fileTitle, Object context, String filePath) {

        try {
            //写入文件
            File file = new File(filePath);

            //检查存放目录是否存在
            if(!file.exists() && !file.isDirectory()) {
                //目录不存在则创建
                file.mkdir();
            }

            file = new File(filePath + fileTitle);

            //检查文件是否存在
            if (!file.exists()) {
                //文件不存在则创建
                file.createNewFile();
            }

            BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(file, true));

            if (!(context instanceof String)) {
                context = JSON.toJSONString(context);
            }

            //添加内容
            bufferedWriter.write((String) context);
            //添加换行
            bufferedWriter.newLine();

            //将缓冲区的内容添加到文件
            bufferedWriter.flush();
            //关闭
            bufferedWriter.close();

            return filePath + fileTitle;
        } catch (Exception e) {
            log.error(String.format("FileUtils -> %s 有错误出现：%s",
                    e.getStackTrace()[0].getMethodName(),
                    e.getMessage())
            );

            return null;
        }
    }

    /**
     * @description: 删除文件
     * @author jingz
     * @data 2020/2/7 13:53
     * @params filePath 文件路径（包括文件名和后缀）
     * @return void
     **/
    public static boolean delete(String filePath) {
        try {
            File file = new File(filePath);

            //判断文件是否存在
            if (!file.exists() && !file.isFile()){
                //不存在则抛出不存在异常
                throw new RuntimeException("文件不存在");
            }

            //删除文件
            file.delete();

            return true;
        } catch (Exception e) {
            log.error(String.format("FileUtils -> %s 出现错误：%s",
                    e.getStackTrace()[0].getMethodName(),
                    e.getMessage())
            );
            return false;
        }
    }

    /***
     * @Author jingz
     * @Description 读取文件内容
     * @Date 15:13 2020/2/7
     * @Param [filePath 文件路径 包括文件名和后缀]
     * @return java.lang.String
     **/
    public static Object readFile(String filePath) {
        try {
            File file = new File(filePath);

            //判断路径指向是不是文件，且判断是否存在
            if (!file.exists()) {
                throw new RuntimeException("目录或文件不存在");
            } else if(!file.isFile()) {
                throw new RuntimeException("路径指向不为文件");
            }

            BufferedReader bufferedReader = new BufferedReader(new FileReader(file));

            List<Object> strings = new ArrayList<>();
            String s = null;

            //先读取每一行，判断是否为空，不为空则添加
            while ((s = bufferedReader.readLine()) != null) {
                strings.add(s);
            }

            bufferedReader.close();
            return strings;

        } catch (Exception e) {
            log.error(String.format("FileUtils -> %s 发生错误：%s",
                    e.getStackTrace()[0].getMethodName(),
                    e.getMessage())
            );

            return null;
        }
    }

    /**
     * @Author jingz
     * @Description 判断文件是否存在
     * @Date 16:12 2020/2/7
     * @Param [fileTitle 需要检查的文件列表]
     * @return java.lang.String
     **/
    public static String fileExists(String filepath, String... fileTitle) {
        //遍历变量列表
        for (String s : fileTitle) {
            File file = new File(filepath + s);
            //判断文件是否存在且是否为文件
            if (file.exists() && file.isFile()) {
                //返回路径
                return s;
            }
        }

        return null;
    }
}
